﻿///////////////////////////////////////////////////////////////////////////////
/// Copyright (c) by longshuang@msn.cn 2014.
/// All rights reserved.
///
/// @File	: Engine.System.hpp
/// @Brief	: 平台相关的接口封装
/// @Author	: Leo Zhao <longshuang@msn.cn>
/// @Date	: 2014-12-03
///
/// CHANGELOG
///		2015-03-18	使用std::string作为返回，防止多线程重入问题；增加Path解析
/// 	2014-12-03	加入路径操作和时间对象接口	
///////////////////////////////////////////////////////////////////////////////
#ifndef		__ENGINE_SYSTEM_HPP_INCLUDE__
#define		__ENGINE_SYSTEM_HPP_INCLUDE__

#include	<cstdint>
#include	<ctime>
#include	<string>

namespace Engine { namespace System { namespace Path {

	/// @Brief	: 检测一个目录是否存在
	/// @Param	: szPath	目标目录的路径
	/// @Return	: True，目录存在；false，目录不存在
	bool		Exists(const std::string & szPath);

	/// @Brief	: 创建一个目录
	/// @Param	: szPath	要创建的目录路径
	/// @Return	: True，创建成功；false，创建失败
	bool		Create(const std::string & szPath);

	/// @Brief	: 当前工作路径
	/// @Param	: NONE
	/// @Return	: 返回当前的工作路径，只读
	std::string	Current();

	/// @Brief	: 设置当前的工作路径
	/// @Param	: szPath	需要改变的目标目录
	/// @Return	: 改变后的工作路径。「注」可能改变失败，所以返回的是最终的路径
	std::string	Change(const std::string & szPath);

	/// @Brief	: 取得当前路径中的纯目录部分
	/// @Param	: szFullPath	给定的文件全路径
	/// @Return	: 返回路径中的纯目录部分
	std::string PurePath(const std::string & szFullPath);

	/// @Brief	: 取得当前路径中的纯文件名部分
	/// @Param	: szFullPath	给定的文件全路径
	/// @Return	: 返回路径中的纯目录部分
	std::string PureFile(const std::string & szFullPath);

	/// @Brief	: 遍历当前目录下的所有文件
	/// @Param	: szRoot	指定的目录
	/// @Param	: bIntoSub	是否进入子目录递归
	/// @Param	: pOpt		需要调用的操作
	/// @Return	: NONE
	void		ForEachFile(const std::string & szRoot, bool bIntoSub, void(*pOpt)(const std::string &));

} } };

namespace Engine { namespace System { 

	/// @Brief	: 时间操作类
	class Time {
	public:
		Time() 
			: nYear(1970)
			, nMonth(1)
			, nDay(1)
			, nWeek(4)
			, nHour(0)
			, nMinute(0)
			, nSecond(0)
			, nMilliSec(0)
			, nUnixSec(0) {}
		Time(const Time & iOther)
			: nYear(iOther.nYear)
			, nMonth(iOther.nMonth)
			, nDay(iOther.nDay)
			, nWeek(iOther.nWeek)
			, nHour(iOther.nHour)
			, nMinute(iOther.nMinute)
			, nSecond(iOther.nSecond)
			, nMilliSec(iOther.nMilliSec)
			, nUnixSec(iOther.nUnixSec) {}

		Time &	operator=(const Time &);

	public:
		/// @Brief	: 取得当前的时间信息
		/// @Param	: NONE
		/// @Return	: 返回当前的时间信息
		static Time		Current();

		/// @Brief	: 取得一个时间点的详细信息
		/// @Param	: nUnixSec	Unix系统时间戳
		/// @Return	: 返回指定时间点的详细描述
		static Time		Convert(time_t nUnixTime);

		/// @Brief	: 取得一个时间点的详细信息
		/// @Param	: nYear		年
		/// @Param	: nMonth	月
		/// @Param	: nDay		日
		/// @Param	: nHour		时
		/// @Param	: nMin		分
		/// @Param	: nSecond	秒
		/// @Return	: 返回指定时间点的详细描述
		static Time		Convert(int nYear, int nMonth, int nDay, int nHour = 0, int nMin = 0, int nSecond = 0);

		/// @Brief	: 取得CPU运行毫秒时间
		/// @Param	: NONE
		/// @Return	: 返回当前机器CPU运行的毫秒时间
		static uint64_t	Tick();

	public:
		int		nYear;
		int		nMonth;
		int		nDay;
		int		nWeek;
		int		nHour;
		int		nMinute;
		int		nSecond;
		int		nMilliSec;
		time_t	nUnixSec;
	};

} };

#endif//!	__ENGINE_TYPES_HPP_INCLUDE__

